今天這一題相對單純、簡單一些,但當中也有一些小技巧和觀念,還是蠻值得一看的!
You are given a large integer represented as an integer array digits, where each digits[i] is the ith digit of the integer. The digits are ordered from most significant to least significant in left-to-right order. The large integer does not contain any leading 0's.
Increment the large integer by one and return the resulting array of digits.
Example 1:
Input: digits = [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Incrementing by one gives 123 + 1 = 124.
Thus, the result should be [1,2,4].
Example 2:
Input: digits = [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.
Incrementing by one gives 4321 + 1 = 4322.
Thus, the result should be [4,3,2,2].
Example 3:
Input: digits = [0]
Output: [1]
Explanation: The array represents the integer 0.
Incrementing by one gives 0 + 1 = 1.
Thus, the result should be [1].
Example 4:
Input: digits = [9]
Output: [1,0]
Explanation: The array represents the integer 9.
Incrementing by one gives 9 + 1 = 10.
Thus, the result should be [1,0].
這題的意思也相對簡單明暸,題目會給我們一個陣列,當中的元素是整數型態,他希望我們能夠把這整個陣列當成一個整數來看,並且對其加一,最後再以陣列的型式回傳。以例子來看,[2,9,9,9]會變成[3,0,0,0],[2,8,7,6] => [2,8,7,7]。
在python中我們可用非常簡潔的寫法,就能達到題目的要求,以下這段程式碼的邏輯就是,先將陣列中的整數換成字串型態,接著再把他們合併,合併後再變成整數型態,再加一,而後再把這些變成字串後再變成陣列,雖然這邊更正確的事要再把其中元素換回整數,不過Leetcode測資似乎沒有檢查到這部分。
以下為python3的程式碼
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
return list(str(int("".join([str(i) for i in digits]))+1))
然而,上述那種方法雖然很容易理解,也很簡潔,但對電腦來說實在是稍嫌慢了一些,因為在轉換字串與合併字串,整數再轉回字串,都耗費了許多時間,以下這種解法,最多只要跑一次迴圈就能達成的解法,甚至有時候可以更快。
簡單來說就是我們不把陣列換成整數,我們直接對陣列中的元素作處理,從最後一個開始,如果走訪到的該元素是9那就變成0,而且迴圈要繼續,如果是9以外的數,那我們就加一,直接return當下的陣列,就是題目所求。但如果迴圈全部跑完,卻還沒return,就代表陣列中每個元素都是9,那我們就必須陣列開頭的地方插入1,這樣才符合要求!
以下是C++的程式碼
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for(int i=digits.size()-1;i>-1;i--){
if(digits[i] == 9){
digits[i] = 0;
}
else{
digits[i] = digits[i] + 1;
return digits;
}
}
digits.insert(digits.begin(), 1);
return digits;
}
};